//package com.qfedu.edu.slot.impl;
//
//import com.alibaba.druid.util.StringUtils;
//import com.qfedu.edu.exception.handler.BusinessException;
//import com.qfedu.edu.manager.RedisManager;
//import com.qfedu.edu.result.ResponseCode;
//import com.qfedu.edu.slot.generate.GenerateSlot;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.xml.ws.Response;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author xiaobobo
// * @title: ReqTimeCheckSlot
// * @projectName cd-fy-2401-third-project-parent
// * @description: token防止丢失的检测
// * @date 2024/9/23  15:32
// */
//@Component
//@Slf4j
//public class ReqTimeCheckSlot extends GenerateSlot {
//
//
//    @Autowired
//    private RedisManager redisManager;
//
//    @Override
//    public int getOrder() {
//        return Integer.MIN_VALUE;
//    }
//
//    @Override
//    public boolean dealReq(HttpServletRequest req) {
//        String requestURI = req.getRequestURI();
//        log.info("token丢失的检测....");
//        //TODO token丢失检测....
//        //首先去Redis中找到这个字段
//        //首先拿到前端传递过来的这个时间
//        String sign = req.getHeader("sign");
//        //第二个：判断是否传递了这个时间
//        if(StringUtils.isEmpty(sign)){
//             throw new BusinessException(ResponseCode.SIGN_EXCEPTION.getCode(),
//                     ResponseCode.SIGN_EXCEPTION.getMsg());
//        }
//        //如果执行到这里 说明传递了签名信息
//        //首先去Redis中去拿这个接口上一次的请求时间是多久
//        //拿这个请求信息之前首先要拿到这个请求的地址
//
//        String token = req.getHeader("token");
//        //构建我们的访问key=token:requestURI   value：时间的嘛
//        //拿到这个记录的请求时间
//        String recordReqTime = redisManager.getString(token + "-" + requestURI);
//        if(StringUtils.isEmpty(recordReqTime)){
//           //说明是第一次访问
//            log.info("第一次访问这个接口...放行...");
//            String key=token+"-"+requestURI;
//            redisManager.addString(key,sign,30, TimeUnit.DAYS);
//            return true;
//        }
//        //执行到这里 说明不是第一次访问
//        //将前端当前传递过来的时间 弄成long类型
//        long reqTime = Long.parseLong(sign);
//        //将记录时间弄成long类型
//        long recordLongTime = Long.parseLong(recordReqTime);
//        if(reqTime<=recordLongTime){
//            //说明是攻击 其余人偷了这个token
//            throw new BusinessException(ResponseCode.REQ_EXCEPTION.getCode(),
//                    ResponseCode.REQ_EXCEPTION.getMsg());
//        }
//        //如果执行到这里 说明身份合法
//        //那么修改这个记录
//        String key=token+"-"+requestURI;
//        redisManager.addString(key,sign,30, TimeUnit.DAYS);
//        log.info("身份鉴别成功....");
//        return true;
//    }
//}
